﻿using LM.InterfacesFabricas.DTOs;
using LM.InterfacesFabricas.Interfaces.Servicos;
using LM.InterfacesFabricas.Utilidades;
using LM.Negocio.Objetos;
using LM.Negocio.Validadores;
using LM.Repositorios;
using LM.Repositorios.Interfaces;
using System;
using System.Linq;
using System.Collections.Generic;
using LM.Negocio.Utilidades;

namespace LM.Servicos
{
    public class ServicoDeItemTabelaDePreco : IServicoItemTabelaDePreco
    {
        public void Cadastre( DtoItemTabelaDePreco itemTabelaPreco )
        {
            var repositorioDeItemTabelaPreco = FabricaDeRepositorios.Crie<IRepositorioDeItemTabelaDePreco>();
            var validadorDeItemTabelaPreco = new ValidadorDeItemTabelaDePreco( repositorioDeItemTabelaPreco );
            var itemTabelaPrecoObjeto = ConversorDeObjetos.Copie<ItemTabelaDePreco>( itemTabelaPreco );

            validadorDeItemTabelaPreco.ValideCadastro( itemTabelaPrecoObjeto );
            repositorioDeItemTabelaPreco.Cadastre( itemTabelaPrecoObjeto );
        }

        public void Atualize( DtoItemTabelaDePreco itemTabelaPreco )
        {
            var repositorioDeItemTabelaPreco = FabricaDeRepositorios.Crie<IRepositorioDeItemTabelaDePreco>();
            var validadorDeItemTabelaPreco = new ValidadorDeItemTabelaDePreco( repositorioDeItemTabelaPreco );
            var itemTabelaPrecoObjeto = ConversorDeObjetos.Copie<ItemTabelaDePreco>( itemTabelaPreco );

            validadorDeItemTabelaPreco.ValideAtualizacao( itemTabelaPrecoObjeto );
            repositorioDeItemTabelaPreco.Atualize( itemTabelaPrecoObjeto );
        }

        public void Exclua( int codigo )
        {
            var repositorioDeItemTabelaPreco = FabricaDeRepositorios.Crie<IRepositorioDeItemTabelaDePreco>();
            var validadorDeItemTabelaPreco = new ValidadorDeItemTabelaDePreco( repositorioDeItemTabelaPreco );
            var itemTabelaPrecoObjeto = ConversorDeObjetos.Copie<ItemTabelaDePreco>( repositorioDeItemTabelaPreco.Consulte( codigo ) );

            validadorDeItemTabelaPreco.ValideExclusao( itemTabelaPrecoObjeto );
            repositorioDeItemTabelaPreco.Exclua( itemTabelaPrecoObjeto );
        }

        public DtoItemTabelaDePreco Consulte( int codigo )
        {
            var itemTabelaPrecoObjeto = FabricaDeRepositorios.Crie<IRepositorioDeItemTabelaDePreco>().Consulte( codigo );
            return ConversorDeObjetos.Copie<DtoItemTabelaDePreco>( itemTabelaPrecoObjeto );
        }

        public IList<DtoItemTabelaDePreco> ConsulteTodos()
        {
            return FabricaDeRepositorios.Crie<IRepositorioDeItemTabelaDePreco>().ConsulteTodos().ToDtosItensTabelaDePreco();
        }

        public IList<DtoItemTabelaDePreco> ConsulteTodos( bool preencherForeignKey )
        {
            if ( !preencherForeignKey )
                return ConsulteTodos();

            return ConsulteTodos().ToList().ConvertAll<DtoItemTabelaDePreco>( delegate( DtoItemTabelaDePreco e )
            {
                PreencherForeingKey( e );
                return e;
            } );
        }

        private void PreencherForeingKey( DtoItemTabelaDePreco item )
        {
            item.TabelaPreco = ConversorDeObjetos.Copie<DtoTabelaPreco>( FabricaDeRepositorios.Crie<IRepositorioDeTabelaPreco>().Consulte( item.TabelaPrecoId ) );
            item.TipoVeiculo = ConversorDeObjetos.Copie<DtoTipoDeVeiculo>( FabricaDeRepositorios.Crie<IRepositorioTipoDeVeiculo>().Consulte( item.TipoVeiculoId ) );
            item.Vaga = ConversorDeObjetos.Copie<DtoVaga>( FabricaDeRepositorios.Crie<IRepositorioDeVaga>().Consulte( item.TipoVagaId ) );
        }
    }
}
